package com.example.boot;

import com.example.boot.bean.Person;
import com.example.boot.bean.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class Boot302DemoApplication {

    /*⾃动配置流程细节梳理：
1、导⼊ starter-web ：导⼊了web开发场景
○
○
■
2. 完整流程
思考：
1、SpringBoot怎么实现导⼀个 starter 、写⼀些简单配置，应⽤就能跑起来，我们⽆需关⼼
整合
2、为什么Tomcat的端⼝号可以配置在 application.properties 中，并且 Tomcat 能启
动成功？
3、导⼊场景后哪些⾃动配置能⽣效？
12
1、场景启动器导⼊了相关场景的所有依赖： starter-json 、 starter-tomcat 、 sp
ringmvc
2、每个场景启动器都引⼊了⼀个 spring-boot-starter ，核⼼场景启动器。
3、核⼼场景启动器引⼊了 spring-boot-autoconfigure 包。
4、 spring-boot-autoconfigure ⾥⾯囊括了所有场景的所有配置。
5、只要这个包下的所有类都能⽣效，那么相当于SpringBoot官⽅写好的整合功能就⽣效了。
6、SpringBoot默认却扫描不到 spring-boot-autoconfigure 下写好的所有配置类。
（这些配置类给我们做了整合操作），默认只扫描主程序所在的包。
2、主程序： @SpringBootApplication
1、 @SpringBootApplication 由三个注解组成 @SpringBootConfiguration 、 @E
nableAutoConfiguratio 、 @ComponentScan
2、SpringBoot默认只能扫描⾃⼰主程序所在的包及其下⾯的⼦包，扫描不到 spring-boo
t-autoconfigure 包中官⽅写好的配置类
3、 @EnableAutoConfiguration ：SpringBoot 开启⾃动配置的核⼼。
1. 是由 @Import(AutoConfigurationImportSelector.class) 提供功能：批量
给容器中导⼊组件。
2. SpringBoot启动会默认加载 142个配置类。
3. 这142个配置类来⾃于 spring-boot-autoconfigure 下 META-INF/spring/o
rg.springframework.boot.autoconfigure.AutoConfiguration.import
s ⽂件指定的
项⽬启动的时候利⽤ @Import 批量导⼊组件机制把 autoconfigure 包下的142 xx
xxAutoConfiguration 类导⼊进来（⾃动配置类）
虽然导⼊了 142 个⾃动配置类
4、按需⽣效：
并不是这 142 个⾃动配置类都能⽣效
每⼀个⾃动配置类，都有条件注解 @ConditionalOnxxx ，只有条件成⽴，才能⽣效
3、 xxxxAutoConfiguration ⾃动配置类
1、给容器中使⽤@Bean 放⼀堆组件。
2、每个⾃动配置类都可能有这个注解 @EnableConfigurationProperties(ServerPr
operties.class) ，⽤来把配置⽂件中配的指定前缀的属性值封装到 xxxPropertie
●
●
●
●
●
●
●
●
●
○
○
○
○
○
●
○
○
●
●
13
s 属性类中
3、以Tomcat为例：把服务器的所有配置都是以 server 开头的。配置都封装到了属性类
中。
4、给容器中放的所有组件的⼀些核⼼参数，都来⾃于 xxxProperties 。 xxxProperti
es 都是和配置⽂件绑定。
只需要改配置⽂件的值，核⼼组件的底层参数都能修改
4、写业务，全程⽆需关⼼各种整合（底层这些整合写好了，⽽且也⽣效了）
核⼼流程总结：
1、导⼊ starter ，就会导⼊ autoconfigure 包。
2、 autoconfigure 包⾥⾯ 有⼀个⽂件 META-INF/spring/org.springframework.bo
ot.autoconfigure.AutoConfiguration.imports ,⾥⾯指定的所有启动要加载的⾃动配
置类
3、@EnableAutoConfiguration 会⾃动的把上⾯⽂件⾥⾯写的所有⾃动配置类都导⼊进来。
xxxAutoConfiguration 是有条件注解进⾏按需加载
4、 xxxAutoConfiguration 给容器中导⼊⼀堆组件，组件都是从 xxxProperties 中提取
属性值
5、 xxxProperties ⼜是和配置⽂件进⾏了绑定
效果：导⼊ starter 、修改配置⽂件，就能修改底层⾏为。*/

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(Boot302DemoApplication.class, args);
        String[] beanDefinitionNames = run.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println("beanDefinitionName = " + beanDefinitionName);
        }
        /*User bean = run.getBean(User.class);
        System.out.println("bean = " + bean);*/
       /* for (String s : run.getBeanNamesForType(User.class)) {

            System.out.println("s = " + s);
        }

        Object userhaha1 = run.getBean("userhaha");
        Object userhaha2 = run.getBean("userhaha");
        System.out.println(userhaha2==userhaha1);*/

        Person bean = run.getBean(Person.class);
        System.out.println("Person = " + bean);
    }

}
